/**
 * @author WangSong
 * @修改说明 增加了默认值的构造方法 
 * @time  2009-04-29
 */
package cn.biplam.front.template.base;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.HtmlDiv;
import cn.biplam.front.html.HtmlInput;
import cn.biplam.front.html.HtmlPassword;
import cn.biplam.front.html.HtmlText;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.template.Template;

/**
 * : 文本输入模板
 * @author 	WangSong
 * @create 	2009-4-21 下午08:58:57
 * @version 1.0
 */
public class Input implements Template{

	private HtmlDiv div;
	private HtmlText label;
	private HtmlInput input;
	private int size;
	/** 输入框的最大长度 */
	private int maxLength=-1;
	
	public enum Input_Type{
		text,
		password;
	}

	/**
	 * 构造方法		传入标签名称和字段名称初始化
	 * @param sLabel		显示的标签名称
	 * @param sName			对应的字段名称
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName) throws ErrorMessage{
		this(sLabel,sName,Input_Type.text);
	}
	
	/**
	 * 创建输入框
	 * @param sLabel 标签名
	 * @param sName  输入框对应字段名
	 * @param value  默认值
	 * @param size   占位大小(子数,1个中文字占两个字位,1个英文字占1个字位)
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName,String value,int size) throws ErrorMessage{
		this(sLabel,sName,Input_Type.text,value,size);
	}
	
	/**
	 * 创建输入框
	 * @param sLabel 标签名
	 * @param sName  输入框对应字段名
	 * @param value  默认值
	 * @param size   占位大小(子数,1个中文字占两个字位,1个英文字占1个字位)
	 * @param maxLength 输入框最大可输入字符数
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName,String value,int size,int maxLength) throws ErrorMessage{
		this(sLabel,sName,Input_Type.text,value,size,maxLength);
	}

	/**
	 * 构造方法		传入标签名称、字段名称和类型初始化
	 * @param sLabel		显示的标签名称
	 * @param sName			对应的字段名称
	 * @param type			输入类型Input_Type
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName,Input_Type type) throws ErrorMessage{
		this(sLabel,sName,type,null);
	}
	
	/**
	 * 构造方法		传入标签名称、字段名称、类型初始化和默认值
	 * @param sLabel		显示的标签名称
	 * @param sName			对应的字段名称
	 * @param type			输入类型Input_Type
	 * @param value         默认值
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName,Input_Type type,String value) throws ErrorMessage{
		this(sLabel,sName,type,value,-1);
	}
	
	/**
	 * 构造方法		传入标签名称、字段名称、类型初始化和默认值
	 * @param sLabel		显示的标签名称
	 * @param sName			对应的字段名称
	 * @param type			输入类型Input_Type
	 * @param value         默认值
	 * @param size          占位字数
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName,Input_Type type,String value,int size) throws ErrorMessage{
		this(sLabel,sName,type,value,size,-1);
	}
	
	/**
	 * 构造方法		传入标签名称、字段名称、类型初始化和默认值
	 * @param sLabel		显示的标签名称
	 * @param sName			对应的字段名称
	 * @param type			输入类型Input_Type
	 * @param value         默认值
	 * @param size          占位字数
	 * @param maxLength     输入框最大可输入字符数
	 * @throws ErrorMessage
	 */
	public Input(String sLabel,String sName,Input_Type type,
			String value,int size,int maxLength) throws ErrorMessage{
		this.div=new HtmlDiv(null,"ip");
		this.label=new HtmlText(null,"il",sLabel);
		this.div.put(this.label);
		this.size = size;
		this.maxLength = maxLength;
		switch(type){
		case text:
			this._createText(sName,value);
			break;
		case password:
			this._createTPassword(sName,value);
		}
	}

	/**
	 *  设置输入框大小
	 * @param value 输入框值
	 */
	private void _setSize(String value) throws ErrorMessage{
		if(this.size!=-1){
			this.input.setSize(this.size);
		}else if(value!=null&&value.getBytes().length>20){
			this.input.setSize(value.getBytes().length);
		}
		if(maxLength>0){
			this.input.setMaxLength(maxLength);
			String script = 
				"while(value.replace(/[^\\x00-\\xff]/g,'**').length>maxLength)value=value.slice(0,-1)";
			this.input.bind(Window_Event.OnBlur, 
					script);
		}
	}
	
	/**
	 * 创建文本输入框
	 * @param sName	   输入框名称
	 * @param value    默认值
	 * @throws ErrorMessage
	 */
	private void _createText(String sName,String value) throws ErrorMessage{
		this.input=new HtmlInput(null,"ii",sName,value);
		_setSize(value);
		this.div.put(this.input);
	}

	/**
	 * 创建密码输入框
	 * @param sName
	 * @throws ErrorMessage
	 */
	private void _createTPassword(String sName,String value) throws ErrorMessage{
		this.input=new HtmlPassword(null,"ii",sName,value);
		_setSize(value);
		this.div.put(this.input);
	}

	/**
	 * 获取输入框显示长度
	 * @return
	 */
	public int getLength(){
		return this.label.length()+this.input.getSize();
	}
	
	/**
	 * 设置input可显示的字符数量 
	 * @param size	字符数量
	 */
	public void setSize(int size){
		this.input.setSize(size);
	}
	
	/**
	 * 设置或获取用户可在文本控件中输入的最多字符数(一个汉字为2个字符，一个英文字母一个字符) 
	 * @param maxLength	字符数
	 */
	public void setMaxLength(int maxLength){
		this.input.setMaxLength(maxLength);
	}

	/**
	 * 返回设置好的HtmlWindow对象
	 * @return	HtmlWindow
	 * @throws ErrorMessage 
	 */
	public HtmlWindow get() throws ErrorMessage{
//		this.div.setStyleWidth(Integer.toString(this.getLength()*7+7));
		return this.div;
	}

}
